# 内嵌函数
def func():
    print('func()被调用')

    # 定义内嵌函数
    def inlinefunc():
        print('内嵌函数被调用')

    # 调用内嵌函数
    inlinefunc()


"""
func()被调用
内嵌函数被调用
"""
func()

"""
闭包是由函数及其相关的引用环境组合而成的实体(即：闭包=函数+引用环境)
闭包中，外部函数的变量 对于 内部函数的变量 而言就是 全局变量
"""


def closureFuncX(x):
    # 定义内部函数，并引用外部函数的值
    def closureFuncY(y):
        return x * y

    # 返回内部函数
    return closureFuncY


closure = closureFuncX(2)
print(closure)  # 一个函数对象
print(type(closure))  # <class 'function'>
print(closure(3))  # 6
# 也可以这样调用闭包函数
print(closureFuncX(3)(4))  # 12


# 闭包中，外部函数的变量 对于 内部函数的变量 而言就是 全局变量
def variableFunc():
    x = 3

    def inlineFunc():
        # x在内嵌函数中没有定义，所以会报错
        """
        x *= x
        return x
        """

    return inlineFunc()


# 若需要更改，将外部函数的值设为一个列表容器
def variableFunc():
    x = [3]

    def inlineFunc():
        x[0] *= x[0]
        return x[0]

    # 返回内部函数
    return inlineFunc()


print(variableFunc())  # 9
